home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1996 / MacHack 1996.toast / Hacks / Hacks '96 / Better Unmount / Source Code! / UnmountHack.c < prev    next >
Encoding:
Text File  |  1996-06-22  |  3.9 KB  |  203 lines  |  [TEXT/CWIE]

  1. // Better Unmount
  2. //
  3. //    (C) 1996 Damon Cokenias All Rights Reserved
  4. //    cokenias@mtn-palace.com
  5. //
  6.  
  7. #include <A4Stuff.h>
  8. #include <PLStringFuncs.h>
  9.  
  10. #define        kItemsDialogID            128
  11. #define        kOKButton                1
  12. #define        kLabelItem                2
  13. #define        kListItem                3
  14.  
  15. #define        kStringsID                128
  16.     enum {
  17.         kLabelPluralPrefix = 1,
  18.         kLabelPluralSuffix,
  19.         kLabelSingularPrefix,
  20.         kLabelSingularSuffix
  21.     };
  22.  
  23. pascal void MyUserItemProc (DialogPtr dlog, short itemNumber);
  24. pascal Boolean MyFilterProc (DialogPtr dlog, EventRecord* event, short* itemHit);
  25. OSErr    GetVolName (short vRefNum, Str32 name);
  26.  
  27. OSErr    GetVolName (short vRefNum, Str32 name)
  28. {
  29.     HParamBlockRec        pb;
  30.     
  31.     pb.volumeParam.ioNamePtr = name;
  32.     pb.volumeParam.ioVRefNum = vRefNum;
  33.     pb.volumeParam.ioVolIndex = 0;
  34.     
  35.     return PBHGetVInfoSync (&pb);
  36.     
  37. }
  38.  
  39. short    AddOpenItemsToList (short vRefNum, ListHandle list);
  40.  
  41. ListHandle    gList = nil;
  42.  
  43. short    AddOpenItemsToList (short vRefNum, ListHandle list)
  44. {
  45.     FCBPBRec    pb;
  46.     Str32        name;
  47.     short        items = 0;
  48.     Cell        cell;
  49.     
  50.     cell.h = 0;
  51.  
  52.     for (pb.ioFCBIndx = 1; ; ++ pb.ioFCBIndx) {
  53.         name [0] = 0;
  54.         pb.ioNamePtr = name;
  55.         pb.ioVRefNum = vRefNum;
  56.         pb.ioRefNum = 0;
  57.         
  58.         if (PBGetFCBInfoSync (&pb))
  59.             break;
  60.  
  61.         cell.v = LAddRow (1, 32767, list);
  62.         LSetCell (&name [1], name [0], cell, list);
  63.         ++items;
  64.     }
  65.     
  66.     return items;
  67. }
  68.  
  69. pascal void MyUserItemProc (DialogPtr dlog, short itemNumber)
  70. {
  71.     Rect        bounds;
  72.     short        itemType;
  73.     Handle        itemHandle;
  74.     
  75.     EnterCodeResource ();
  76.         
  77.     if (itemNumber != kListItem)
  78.         goto Exit;
  79.     
  80.     GetDialogItem (dlog, kListItem, &itemType, &itemHandle, &bounds);
  81.  
  82.     bounds.top -= 1;
  83.     bounds.bottom += 1;
  84.     bounds.left -= 1;
  85.     
  86.     FrameRect (&bounds);
  87.     LUpdate (dlog -> visRgn, gList);
  88.  
  89. Exit:
  90.     ExitCodeResource ();
  91. }
  92.  
  93. pascal Boolean MyFilterProc (DialogPtr dlog, EventRecord* event, short* itemHit)
  94. {
  95.     Rect        bounds;
  96.     short        itemType;
  97.     Handle        itemHandle;
  98.     Boolean        retVal = false;
  99.     
  100.     EnterCodeResource ();
  101.     
  102.     if (event -> what == mouseDown) {
  103.         Point        where = event -> where;
  104.         GrafPtr        oldPort;
  105.         
  106.         GetPort (&oldPort);
  107.         SetPort (dlog);
  108.                 
  109.         GlobalToLocal (&where);
  110.         GetDialogItem (dlog, kListItem, &itemType, &itemHandle, &bounds);
  111.         
  112.         // Restrict clicks to scroll bar
  113.         bounds.left = bounds.right - 16;
  114.         
  115.         if (PtInRect (where, &bounds)) {
  116.             LClick (where, event -> modifiers, gList);
  117.             *itemHit = kListItem;
  118.             retVal = true;
  119.         }
  120.         
  121.         SetPort (oldPort);
  122.     }
  123.  
  124. Exit:
  125.  
  126.     if (retVal == false)
  127.         retVal = StdFilterProc (dlog, event, itemHit);
  128.  
  129.     ExitCodeResource ();
  130.     return retVal;
  131. }
  132.  
  133. pascal void main (short vRefNum)
  134. {
  135.     DialogPtr            dlog = nil;
  136.     short                itemHit;
  137.     Str255                prefix, suffix, prompt;
  138.     Str32                name;
  139.     Rect                bounds;
  140.     Rect                dataBounds;
  141.     Point                cSize;
  142.     short                itemType;
  143.     Handle                itemHandle;
  144.     short                numItems;
  145.     
  146.     EnterCodeResource ();
  147.         
  148.     gList = nil;
  149.     
  150.     dlog = GetNewDialog (kItemsDialogID, nil, (WindowPtr) -1);
  151.     if (!dlog)
  152.         goto Exit;
  153.         
  154.     GetDialogItem (dlog, kListItem, &itemType, &itemHandle, &bounds);
  155.     SetDialogItem (dlog, kListItem, itemType, (Handle) MyUserItemProc, &bounds);
  156.  
  157.     bounds.right -= 16;
  158.  
  159.     dataBounds.top = dataBounds.left = 0;
  160.     dataBounds.bottom = 0;
  161.     dataBounds.right = 1;
  162.     
  163.     cSize.h = 0;
  164.     cSize.v = 0;
  165.     
  166.     gList = LNew (&bounds, &dataBounds, cSize, 0, dlog, TRUE, FALSE, FALSE, TRUE);
  167.     if (!gList)
  168.         goto Exit;
  169.         
  170.     numItems = AddOpenItemsToList (vRefNum, gList);
  171.     GetIndString (prefix, kStringsID, (numItems > 1) ? kLabelPluralPrefix : kLabelSingularPrefix);
  172.     GetIndString (suffix, kStringsID, (numItems > 1) ? kLabelPluralSuffix : kLabelSingularSuffix);
  173.     
  174.     if (GetVolName (vRefNum, name))
  175.         name [0] = '\0';
  176.         
  177.     prompt [0] = '\0';
  178.     PLstrcat (prompt, prefix);
  179.     PLstrcat (prompt, name);
  180.     PLstrcat (prompt, suffix);
  181.         
  182.     GetDialogItem (dlog, kLabelItem, &itemType, &itemHandle, &bounds);
  183.     SetDialogItemText (itemHandle, prompt);
  184.     
  185.     SetDialogDefaultItem (dlog, kOKButton);
  186.  
  187.     ShowWindow (dlog);
  188.     
  189.     do {
  190.         ModalDialog (MyFilterProc, &itemHit);
  191.     } while (itemHit != kOKButton);        
  192.  
  193. Exit:
  194.     if (gList)
  195.         LDispose (gList);
  196.         
  197.     if (dlog)
  198.         DisposeDialog (dlog);
  199.         
  200.     ExitCodeResource ();
  201. }
  202.  
  203.